package com.huangsm.juc.consumer;

import lombok.AllArgsConstructor;

/**
 * 生产者和消费者案例
 */
public class TestProductorAndConsumer {
    public static void main(String[] args) {
        Clerk clerk=new Clerk();
       Productor productor=new Productor(clerk);
        Consumer consumer=new Consumer(clerk);

        new Thread(productor,"生产者A").start();
        new Thread(consumer,"消费者A").start();
        //出现了虚假唤醒，如果想要解决这个问题，应该将wait总是使用在循环中
        new Thread(productor,"生产者B").start();
        new Thread(consumer,"消费者B").start();
    }
}
class Clerk{
    private int product=0;

    //进货
    public synchronized void get(){
        while (product>=1){//为了避免出现虚假唤醒问题，wait应该总是出现了循环当中
            System.out.println("产品已满无法添加");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
            System.out.println(Thread.currentThread().getName()+":"+ ++product);
            this.notifyAll();

    }
    //卖货
    public synchronized void sale(){
        while (product<=0){
            System.out.println("货买完啦");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
            System.out.println(Thread.currentThread().getName()+":"+ --product);
            this.notifyAll();

    }
}

//生产者
@AllArgsConstructor
class Productor implements Runnable{
    private Clerk clerk;

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.get();
        }
    }
}

//消费者
@AllArgsConstructor
class Consumer implements Runnable{
    private Clerk clerk;

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            clerk.sale();
        }
    }
}

